package MT::Plugin::AddHelp;
use strict;
use warnings;
use base qw( MT::Plugin );

use vars qw($VERSION);
$VERSION = '1.0.1';

my $plugin = MT::Plugin::AddHelp->new({
    id          => 'AddHelp',
    key         => __PACKAGE__,
    name        => 'Add Help',
    description => '<__trans phrase="Add help pages.">',
    version     => $VERSION,
    author_name => 'Tomohiro Okuwaki (help of @usualoma)',
    author_link => 'http://www.tinybeans.net/blog/',
    plugin_link => 'http://www.tinybeans.net/blog/download/mt-plugin/add-help.html',
    l10n_class  => 'AddHelp::L10N',
    blog_config_template => 'blog_config.tmpl',
    settings    => new MT::PluginSettings([
        ['addhelp_apply', {Default => 0, Scope => 'blog'}],
        ['addhelp_title', {Default => '', Scope => 'blog'}],
        ['addhelp_content', {Default => '', Scope => 'blog'}],
        ]),
});
MT->add_plugin($plugin);

# init_registry
sub init_registry {
    my $plugin = shift;

    # init_registry の中ではプラグインのデータを取得できない
    $plugin->registry({
        applications => {
            cms => {
                menus => {
                    'userhelp' => {
                        label => 'User help',
                        order => 1000,
                    },
                },
                methods => {
                    user_help => '$AddHelp::AddHelp::CMS::load_help_content',
                },
            },
        },
        # init_requestだとログイン前に呼ばれるのでブログが取得できなかった
        # pre_run(もう少し後で呼ばれる処理)の中でラベルを設定する
        # http://www.movabletype.org/documentation/developer/callbacks/pre-run.html
        callbacks => {
            'MT::App::CMS::pre_run' => \&pre_run,
        }
    });
}

sub pre_run {

    my $app = MT->instance;
    # ログイン直後の場合
    if ( $app->request('fresh_login') ) {
        # ブログIDが取得できない場合
        if ( !$app->param('blog_id') ) {
            # $app->user
            #     ログイン中のユーザーを表すオブジェクトを返します。通常はMT::Authorオブジェクトです。
            #     http://www.sixapart.jp/movabletype/manual/object_reference/archives/mt_app.html
            # favorite_blogs
            #     lib/MT/Author.pm 配列が帰ってくる。
            #     SELECT * FROM mt_author_meta WHERE author_meta_type = 'favorite_blogs'; 
            my $fav_blogs = $app->user->favorite_blogs || [];
            my $blog_id = $fav_blogs->[0] if @$fav_blogs;
            $app->param('blog_id', $blog_id) if $blog_id;
            # $app->is_authorized
            #     アクティブなユーザーがアプリケーションへのアクセス権を持つと認証された場合にtrueを返します。
            #     デフォルトでは、常にtrueを返しますが、サブクラス中でオーバーライドして、アプリケーション固有の
            #     認証を受けているかをチェックするようにすることもできます。 is_authorizedがfalseを返すと、
            #     MT::Appレベルで汎用エラー・メッセージを出力して認証が拒否されます。ただしMT:Appのサブクラスでは、
            #     より詳細なエラー・メッセージを出すために、より詳細なチェックを行う必要があることもあるでしょう。
            # 
            #     サブクラスの作成者は、このルーチンが呼び出されたときに、認証を受けたユーザーが$app->{author}に
            #     入っており、また、$app->{query}と$app->param()を用いてCGIクエリー・オブジェクトが取得できる、
            #     という前提でサブクラスを作成することができます。
            #     http://www.sixapart.jp/movabletype/manual/object_reference/archives/mt_app.html
            $app->delete_param('blog_id') unless $app->is_authorized;
        }
    }

    # プラグインのregistryから menus を取得
    my $menus  = $plugin->registry('applications', 'cms', 'menus');
    my $active = &get_config('addhelp_apply');
    my $label = &get_config('addhelp_title');
    
    unless ($active) {return;}
    
    # 設定
    $menus->{'userhelp:help'} = {
        label => $label,
        order => 1010,
        view => 'blog',
        dialog => 'user_help',
    };
}

# プラグインの設定の取得
sub get_config {
    my ($value) = @_;
    my $app = MT->instance;
    my $blog = $app->blog;
    my $scope = $blog ? ('blog:' . $blog->id) : 'system';
    $plugin->get_config_value($value, $scope);
}

1;
